﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DI.Web.Ninject.Models;
using Ninject;

namespace DI.Web.Ninject.Controllers
{
	public class HomeController : Controller
	{
		private Product[] products = {
			new Product{ Name="toy",Category="water",Price=25M},
			new Product{ Name="Mi",Category="phone",Price=999M}
		};
		public ActionResult Index()
		{

			//传统模式，homecontroller和LinqValueCalculator之间还是有耦合
			//IValueCalculator calculator = new LinqValueCalculator();


			//用Ninject获取对象，而不是用new获取对象
			//创建Ninject内核实例，该实例是一个对象，他负责解析依赖项并创建新的对象，当需要一个对象是，使用这个内核而不是new关键字。
			IKernel kernel = new StandardKernel();
			//配置Ninject内核，每一个接口所希望使用的实现对象
			//将想要使用的接口设置为Bind方法的类型参数，并在其返回的结果上调用To方法，将希望实例化的实现类设置为To方法的类型参数。
			kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
			//使用Ninject创建一个对象，调用内核的Get方法。
			//Get方法的类型参数告诉Ninject接口。方法的结果是上面To方法指定的实现类的实例。
			IValueCalculator calculator = kernel.Get<IValueCalculator>();

			ShoppingCart cart = new ShoppingCart(calculator) { products = products };
			decimal totalValue = cart.CalculateProductTotal();
			return View(totalValue);
		}

	}
}